import SockJS from 'sockjs-client';
import { Client, Stomp } from '@stomp/stompjs';

// bun add sockjs-client @stomp/stompjs
// bun add -d @types/sockjs-client
// 参考博客 https://blog.csdn.net/u013737132/article/details/135006370
// @stomp/stompjs 使用参考 https://www.npmjs.com/package/@stomp/stompjs

// StompService 类
class StompService {
    private client: Client;

    // 构造函数，初始化客户端
    constructor() {
        this.client = Stomp.over(() => new SockJS('http://your-stomp-server-url'));

        // 设置连接回调函数
        this.client.onConnect = (frame) => {
            console.log('Connected:', frame);
            // 在这里订阅消息或者发送消息
        };

        // 设置错误回调函数
        this.client.onStompError = (frame) => {
            console.error('Broker reported error: ', frame.headers['message']);
            console.error('Additional details: ', frame.body);
        };
    }

    // 建立连接
    public activate(headers?: Record<string, string>): void {
        console.log("上线", headers)
        this.client.activate();
    }

    // 断开连接
    public disconnect(onDisconnect: () => void): void {
        console.log("下线", onDisconnect)
        this.client.deactivate().then(() => {
            onDisconnect();
        }); // 使用 deactivate 方法断开连接
    }

    // 订阅消息
    public subscribe(destination: string, callback: (message: any) => void, headers?: Record<string, string>): void {
        this.client.subscribe(destination, callback, headers);
    }

    // 取消订阅
    public unsubscribe(destination: string): void {
        this.client.unsubscribe(destination);
    }

    // 发送消息
    public send(destination: string, headers: Record<string, string>, body: string): void {
        this.client.publish({ destination, headers, body });
    }
}

export default new StompService();

// bun add sockjs-client @stomp/stompjs
// bun add -d @types/sockjs-client
// 这两个库通常一起使用以实现WebSocket通信，其中sockjs-client用于创建一个SockJS客户端，而@stomp/stompjs则用于与STOMP协议的服务器进行通信。
// 确保在调用 activate 方法时传递任何必要的连接头部信息（如身份验证令牌）。当连接建立后，onConnect 回调将会被触发，这时你可以执行订阅操作。
// 另外，请注意 disconnect 方法也应当调用 deactivate 而不是 disconnect，以确保正确地断开与 STOMP 服务器的连接。